#
#
# This is free software, licensed under the GNU General Public License v2.
# See /LICENSE for more information.
#
include $(TOPDIR)/rules.mk
include $(INCLUDE_DIR)/image.mk

T_VERSION_CONFIG := $(T_PRODUCT_CONFIG_DIR)/$(PROFILE)/version.config
T_DEVICE_INFO_CONFIG := $(T_PRODUCT_CONFIG_DIR)/$(PROFILE)/device_info.config
T_BUILDTIME_CONFIG := $(KERNEL_BUILD_DIR)/.build_time
T_FWLIST_CONFIG := $(T_PRODUCT_CONFIG_DIR)/$(PROFILE)/firmware.config
JFFS2_BLOCKSIZE = 64k 128k 256k

define imgname
$(BIN_DIR)/$(IMG_PREFIX)-$(2)-$(patsubst jffs2-%,jffs2,$(patsubst squashfs-%,squashfs,$(1)))
endef

define rootfs_align
$(patsubst %-256k,0x40000,$(patsubst %-128k,0x20000,$(patsubst %-64k,0x10000,$(patsubst squashfs-%,0x4,$(1)))))
endef

define sysupname
$(call imgname,$(1),$(2))-sysupgrade.bin
endef

define factoryname
$(call imgname,$(1),$(2))-factory.bin
endef

COMMA:=,

define mkcmdline
$(if $(1),board=$(1) )$(if $(2),console=$(2)$(COMMA)$(3))
endef

SINGLE_PROFILES:=

ENTRY_POINT:=`readelf -h $(KERNEL_BUILD_DIR)/vmlinux.elf | grep Entry | sed -n 's/[ \t]*Entry.*0x/0x/p'`

# for wdr7500v4
#
# $(eval $(call SingleProfile,SLPLzma,$(fs_64kraw),wdr7500v4,wdr7500v4,AP135,ttyS0,115200,8Mlzma))
# there are total 8 parameters.
#
# $$(1) when be called, the parameter will be passed, it will be squashfs.
# $(1) SLPLzma //pack methods. will call mkslpfw
# $(2) 64kraw //template
# $(fs_64kraw) = initramfs 64kraw
#
# $(3) wdr7500v4 //profile name
# $(4) wdr7500v4 //for vmlinux name.
# $(5) AP135 //board
# $(6) ttyS0 //console parameter
# $(7) 115200 //console parameter
# $(8) 8Mlzma //flash size and compress method.
#
# after eval target added like:
#
# define Image/Build/Profile/wdr7500v4
#  $$(call Image/Build/Template/64kraw/$(1),SLPLzma,wdr7500v4,$$(call mkcmdline,AP135,ttyS0,115200), 8Mlzma)
# endef
#
define SingleProfile
  define Image/Build/Profile/$(3)	
	$$(call Image/Build/Template/$(2)/$$(1),$(1),$(4),$$(call mkcmdline,$(5),$(6),$(7)),$(8),$(9),$(10),$(11),$(12))
  endef
  SINGLE_PROFILES += $(3)
endef

define MultiProfile
  define Image/Build/Profile/$(1)
	$(foreach p,$(2),
		$$(call Image/Build/Profile/$p,$$(1))
	)
  endef
endef

KDIR_TMP:=$(KDIR)/tmp
VMLINUX:=$(BIN_DIR)/$(IMG_PREFIX)-vmlinux
UIMAGE:=$(BIN_DIR)/$(IMG_PREFIX)-uImage
fs_squash:=squashfs-only
fs_64k:=64k
fs_64kraw:=64kraw
fs_128k:=128k
fs_256k:=256k
ifeq ($(CONFIG_TARGET_ROOTFS_INITRAMFS),y)
	fs_squash:=initramfs
	fs_64k:=initramfs
	fs_64kraw:=initramfs
	fs_128k:=initramfs
	fs_256k:=initramfs
	VMLINUX:=$(BIN_DIR)/$(IMG_PREFIX)-vmlinux-initramfs
	UIMAGE:=$(BIN_DIR)/$(IMG_PREFIX)-uImage-initramfs
endif

define CompressLzma
  $(STAGING_DIR_HOST)/bin/lzma e $(1) -lc1 -lp2 -pb2 $(3) $(2)
endef

define PatchKernelLzma
	cp $(KDIR)/vmlinux $(KDIR_TMP)/vmlinux-$(1)
	$(call CompressLzma,$(KDIR_TMP)/vmlinux-$(1),$(KDIR_TMP)/vmlinux-$(1).bin.lzma)	
	#$(STAGING_DIR_HOST)/bin/padjffs2 $(KDIR_TMP)/vmlinux-$(1).bin.lzma 64
endef

define PatchKernelGzip
	cp $(KDIR)/vmlinux $(KDIR_TMP)/vmlinux-$(1)
	$(STAGING_DIR_HOST)/bin/patch-cmdline $(KDIR_TMP)/vmlinux-$(1) "$(strip $(2))"
	gzip -9 -c $(KDIR_TMP)/vmlinux-$(1) > $(KDIR_TMP)/vmlinux-$(1).bin.gz
endef

define MkuImage
	mkimage -A arm -O linux -T multi -a 0x80010000 -C $(1) $(2) \
		-e 0x80010000 -n 'ARM Realtek Linux-$(LINUX_VERSION)' \
		-d $(3) $(4)
endef

define MkuImageLzma
	$(call PatchKernelLzma,$(1),$(2),$(3))
	$(call MkuImage,lzma,,$(KDIR_TMP)/vmlinux-$(1).bin.lzma,$(KDIR_TMP)/vmlinux-$(1).uImage)
endef

define MkuImageLzma/initramfs
	$(call PatchKernelLzma,$(1),$(2))
	$(call MkuImage,lzma,,$(KDIR_TMP)/vmlinux-$(1).bin.lzma,$(call imgname,initramfs,$(1))-uImage.bin)
endef

define MkuImageGzip
	$(call PatchKernelGzip,$(1),$(2))
	$(call MkuImage,gzip,,$(KDIR_TMP)/vmlinux-$(1).bin.gz,$(KDIR_TMP)/vmlinux-$(1).uImage)
endef

define MkuImageGzip/initramfs
	$(call PatchKernelGzip,$(1),$(2))
	$(call MkuImage,gzip,,$(KDIR_TMP)/vmlinux-$(1).bin.gz,$(call imgname,initramfs,$(1))-uImage.bin)
endef

define MkuImageOKLI
	$(call MkuImage,lzma,-M 0x4f4b4c49,$(KDIR)/vmlinux.bin.lzma,$(KDIR_TMP)/vmlinux-$(1).okli)
endef

define CatFiles
	if [ `stat -c%s "$(1)"` -gt $(2) ]; then \
		echo "Warning: $(1) is too big"; \
	else if [ `stat -c%s $(3)` -gt $(4) ]; then \
		echo "Warning: $(3) is too big"; \
	else \
		( dd if=$(1) bs=$(2) conv=sync; dd if=$(3) ) > $(5); \
	fi; fi
endef

define Sysupgrade/KR
	$(call CatFiles,$(2),$(3),$(KDIR)/root.$(1),$(4),$(call sysupname,$(1),$(5)))
endef

define Sysupgrade/KRuImage
	$(call CatFiles,$(KDIR_TMP)/vmlinux-$(2).uImage,$(3),$(KDIR)/root.$(1),$(4),$(call sysupname,$(1),$(2)))
endef

define Sysupgrade/RKuImage
	$(call CatFiles,$(KDIR)/root.$(1),$(4),$(KDIR_TMP)/vmlinux-$(2).uImage,$(3),$(call sysupname,$(1),$(2)))
endef

define Image/BuildKernel
	cp $(KDIR)/vmlinux.elf $(VMLINUX).elf
	cp $(KDIR)/vmlinux $(VMLINUX).bin
	dd if=$(KDIR)/vmlinux.bin.lzma of=$(VMLINUX).lzma bs=65536 conv=sync
	dd if=$(KDIR)/vmlinux.bin.gz of=$(VMLINUX).gz bs=65536 conv=sync
	$(call MkuImage,gzip,,$(KDIR)/vmlinux.bin.gz,$(UIMAGE)-gzip.bin)
	$(call MkuImage,lzma,,$(KDIR)/vmlinux.bin.lzma,$(UIMAGE)-lzma.bin)
	-mkdir -p $(KDIR_TMP)
	$(call Image/Build/Initramfs)
endef

# $(call Image/Build/SLPLzma,squashfs-raw,wdr7500v4,board=AP135 console=ttyS0,115200,8Mlzma)
# $(1) squashfs-raw
# $(2) wdr7500v4
# $(3) board=AP135 console=ttyS0,115200
# $(4) 8Mlzma

MKSLPFW_FLAGS =

ifeq ($(CONFIG_UNIFY_FIRMWARE_SUPPORT),y)
	T_EXT_FW_CONFIG := $(T_PRODUCT_CONFIG_DIR)/$(PROFILE)/ext_fw.config
	PR_CONFIG_PATH := $(T_PRODUCT_CONFIG_DIR)/$(PROFILE)
	MKSLPFW_FLAGS := -c $(PR_CONFIG_PATH) \
					 -g $(T_EXT_FW_CONFIG)
endif

define Image/Build/SLPLzma
    $(call PatchKernelLzma,$(2),$(3))
ifeq ($(CONFIG_UNIFY_FIRMWARE_SUPPORT),y)
	-mkdir $(BIN_DIR)/isp_config
endif
	-$(STAGING_DIR_HOST)/bin/mkslpfw \
		-F $(4) \
		-L $(5) \
		-E $(6) \
		-k $(KDIR_TMP)/vmlinux-$(2).bin.lzma \
		-r $(KDIR)/root.$(1) \
		-b $(KDIR)/bootloader.bin \
		-f $(KDIR)/factory_boot.bin \
		-p $(PROFILE) \
		-R $(REVISION) \
		-v $(T_VERSION_CONFIG) \
		-d $(T_DEVICE_INFO_CONFIG) \
		-t $(T_BUILDTIME_CONFIG) \
		-l $(T_FWLIST_CONFIG) \
		-u $(KDIR)/usr_conf_data \
		-o $(BIN_DIR) $(MKSLPFW_FLAGS) \
		-a 0x400
	-rm -f $(T_BUILDTIME_CONFIG)
endef

define Image/Build/HisiliconGzip
	cp $(KDIR)/vmlinux $(KDIR_TMP)/vmlinux-$(1)
	gzip -9 -c $(KDIR_TMP)/vmlinux-$(1) > $(KDIR_TMP)/vmlinux-$(1).bin.gz
	$(call Sysupgrade/KRuImage, )
	$(call Image/Build/Ath,$(1),$(2),$(3),$(4),$(5),$(6),$(7))
endef

define Image/Build/Template/initramfs/initramfs
	$(call Image/Build/$(1)/initramfs,initramfs,$(2),$(3),$(4),$(5),$(6),$(7),$(8))
endef

define Image/Build/Template/all/squashfs
	$(call Image/Build/$(1),squashfs,$(2),$(3),$(4),$(5),$(6),$(7),$(8))
endef

define Image/Build/Template/all/jffs2-64k
	$(call Image/Build/$(1),jffs2-64k,$(2),$(3),$(4),$(5),$(6),$(7),$(8))
endef

define Image/Build/Template/all/jffs2-128k
	$(call Image/Build/$(1),jffs2-128k,$(2),$(3),$(4),$(5),$(6),$(7),$(8))
endef

define Image/Build/Template/all/jffs2-256k
	$(call Image/Build/$(1),jffs2-256k,$(2),$(3),$(4),$(5),$(6),$(7),$(8))
endef

define Image/Build/Template/squashfs-only/squashfs
	$(call Image/Build/$(1),squashfs,$(2),$(3),$(4),$(5),$(6),$(7),$(8))
endef

define Image/Build/Template/64k/squashfs
	$(call Image/Build/$(1),squashfs-64k,$(2),$(3),$(4),$(5),$(6),$(7),$(8))
endef

define Image/Build/Template/64k/jffs2-64k
	$(call Image/Build/$(1),jffs2-64k,$(2),$(3),$(4),$(5),$(6),$(7),$(8))
endef

#
# $(call Image/Build/Template/64kraw/$(1),SLPLzma,wdr7500v4,$$(call mkcmdline,AP135,ttyS0,115200), 8Mlzma)
# $$(call mkcmdline,AP135,ttyS0,115200) eval is:
# board=AP135 console=ttyS0,115200
#
# so the command is
#$(call Image/Build/Template/64kraw/squashfs,SLPLzma,wdr7500v4,board=AP135 console=ttyS0,115200, 8Mlzma)
#$(1) SLPLzma
#$(2) wdr7500v4
#$(3) board=AP135 console=ttyS0,115200
#$(4) 8Mlzma
#
#next call will be:
#$(call Image/Build/SLPLzma,squashfs-raw,wdr7500v4,board=AP135 console=ttyS0,115200,8Mlzma)
#
define Image/Build/Template/64kraw/squashfs
	$(call Image/Build/$(1),squashfs-raw,$(2),$(3),$(4),$(5),$(6),$(7),$(8))
endef

define Image/Build/Template/64kraw/jffs2-64k
	$(call Image/Build/$(1),jffs2-64k,$(2),$(3),$(4),$(5),$(6),$(7),$(8))
endef

define Image/Build/Template/128k/squashfs
	$(call Image/Build/$(1),squashfs,$(2),$(3),$(4),$(5),$(6),$(7),$(8))
endef

define Image/Build/Template/128k/jffs2-128k
	$(call Image/Build/$(1),jffs2-128k,$(2),$(3),$(4),$(5),$(6),$(7),$(8))
endef

define Image/Build/Template/256k/squashfs
	$(call Image/Build/$(1),squashfs,$(2),$(3),$(4),$(5),$(6),$(7),$(8))
endef

define Image/Build/Template/256k/jffs2-256k
	$(call Image/Build/$(1),jffs2-256k,$(2),$(3),$(4),$(5),$(6),$(7),$(8))
endef

$(eval $(call SingleProfile,SLPLzma,$(fs_64kraw),ALL,ALL,,,,8Mlzma,0x80010000,$(ENTRY_POINT)))

define Image/Build/squashfs
	cp $(KDIR)/root.squashfs $(KDIR)/root.squashfs-raw
	cp $(KDIR)/root.squashfs $(KDIR)/root.squashfs-64k
	$(STAGING_DIR_HOST)/bin/padjffs2 $(KDIR)/root.squashfs-64k 64
	cp $(KDIR)/root.squashfs-64k $(BIN_DIR)/$(IMG_PREFIX)-root.squashfs-64k
	$(call prepare_generic_squashfs,$(KDIR)/root.squashfs)
endef

define Image/Build/Initramfs
	$(call Image/Build/Profile/$(PROFILE),initramfs)
endef

define Image/Prepare
	gzip -9 -c $(KDIR)/vmlinux > $(KDIR)/vmlinux.bin.gz
	$(call CompressLzma,$(KDIR)/vmlinux,$(KDIR)/vmlinux.bin.lzma)
endef

define Image/Build
	$(call Image/Build/$(1))
	dd if=$(KDIR)/root.$(1) of=$(BIN_DIR)/$(IMG_PREFIX)-root.$(1) bs=128k conv=sync
	$(call Image/Build/Profile/$(PROFILE),$(1))
endef

$(eval $(call BuildImage))
